#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
高阶函数：一个函数接收另一个函数作为参数，这种函数就称为高阶函数
'''

nums = [4, 1, -8, 5, -3, 2, 7, 6]


# 定义一个函数，用来检查数字是否大于5
def f1(x):
    if x > 5:
        return True
    return False


# 自定义高阶函数，用来过滤列表中的元素
def fn(fun, lst):
    """
    将列表中的所有符合条件的元素筛选出来，并保存到一个新列表中返回
    :param fun:
    :param lst:  要进行筛选的列表
    :return: 返回新列表
    """
    new_list = []
    for i in lst:
        if fun(i):
            new_list.append(i)
    return new_list


new_nums = fn(f1, nums)
print(new_nums)
print('-' * 50)


# filter()函数：用于过滤序列
def f2(x):
    return x % 2 != 0


new_nums = filter(f2, nums)  # 将传入的函数依次作用于每个元素，然后根据返回值是True还是False决定保留还是丢弃该元素
print(new_nums, type(new_nums))  # filter类型
print(list(new_nums))  # 将filter对象转换为list


# map()函数：用于处理序列
def f3(x):
    return x * x


new_nums = map(f3, nums)  # 将传入的函数依次作用到序列的每个元素，并将结果返回
print(new_nums, type(new_nums))  # map类型
print(list(new_nums))  # 将map对象转换为list

# sorted()函数：用于排序
print(sorted(nums))  # 默认按升序
print(sorted(nums, key=abs, reverse=True))  # 根据传入的key函数来进行排序

# 调用列表的sort()方法
nums.sort(key=abs,reverse=True)
print(nums)